export {}

// 此时此刻 可以给T类型添加约束 必须要有length属性
type CustomFunc = <T>(value:T[]) => T[]

// 可以指定更加具体的类型
let func:CustomFunc = (value) => {
  // T 泛型没有办法 分辨有无length属性
  console.log(value.length)
  return value
}

func(["1","3"])


// 第二种方案
// 定义一个接口,接口中必须有length属性
interface ILength {
  length :number
}

let t1:ILength = ''
let t2:ILength = []
// 使用泛型来约束传入的类型,必须要有length属性
type CustomFunc1 = <T extends ILength>(value:T) => T
// 此时,我们用T extends ILength 这行代码约束了传进来的泛型必须要有length属性

let func3:CustomFunc1 = (value) => {
  console.log(value.length)
  return value
}

// func3(1) 不可以 因为1 没有length属性
func3('') //可以 因为字符换拥有length属性
func3([]) //可以